package container

import (
	"context"

	"gitee.com/doraemon1996/bunny/protocol"
)

// 服务消息上下文
type Message interface {
	// 返回上下文
	Context() context.Context

	// 判断消息处理过程是否应当终止
	Closed() bool

	// 消息数据
	Data() *protocol.Message

	// 服务消息简略信息
	String() string

	// 设置参数
	SetValue(any)

	// 获取参数
	GetValue() any

	// 响应源服务的Call
	// 非Call类型不会进行传递
	Response([]byte)

	// 响应源服务错误信息
	// 非Call类型不会进行传递
	Error(error)
}

// 服务对象
type Service interface {
	// 初始化服务
	//	id: 服务唯一ID
	//	args: 服务初始化参数
	Init(ctx context.Context, id uint64, args ...any) error

	// 启动服务逻辑
	Start() error

	// 停止服务
	Stop()

	// 服务描述
	String() string

	// 消息处理方法
	OnMessage(Message)
}

// 容器对象管理器
// 提供容器的 启动、移除、查找 功能，保证方法线程安全
type Manager interface {
	// 初始化管理器
	Init(ctx context.Context, nodeID uint64)

	// 启动管理器
	Start()

	// 关闭管理器 以及所有容器
	Stop()

	// 启动容器
	//	name: 服务初始注册别名
	//	srv: 服务实例
	//	args: 服务初始化参数
	Launch(name string, srv Service, args ...any) (containerID uint64, err error)

	// 注册服务别名
	Register(containerID uint64, name string) error

	// 关闭指定容器
	//	killArg: 容器ID或服务别名, 其余类型的参数将作为未找到对应容器处理
	Kill(killArg any)

	// 获取所有已注册的服务别名以及对应容器ID
	List() map[string]uint64

	// 根据服务别名获取容器ID
	Query(name string) (containerID uint64, exist bool)

	// 派发消息
	PutMessage(containerID uint64, msg Message)
}
